<?php
/**
 * AuthWord 是一个验证码生成器，生成由[a-zA-Z0-9]组成的字符的序列，<br/>
 * 最终返回一个图像标识符，然后用 img 元素将图像标识符嵌入到HTML页面的指定位置。<br/>
 * 具体是用方法见同一目录下的 Demo.php 和 UseAuthWord.php。
 * 
 * 注：目前AuthWord还不是很完善，如有什么建议请随时联系我。
 * 
 * @author hutushen222 hutushen222@gmail.com
 * @version 1.0.0
 * @license APL 2.0
 * @since 2010-8-1
 */
class AuthWord {

	/**
	 * 获取验证码图片
	 * 
	 * @param int $width -- 图像的宽
	 * @param int $height -- 图像的长
	 * @param int $textlen -- 验证码字符的数量
	 * @param int $bgr -- 图像背景颜色的RED部分
	 * @param int $bgg -- 图像背景颜色的GREEN部分
	 * @param int $bgb -- 图像背景颜色的BLUE部分
	 * @param int $mixline -- 干扰线的数量
	 * @param int $mixpixel -- 干扰像素的数量
	 */
	public function getAuthImage($width = 77, $height = 37, $textlen = 4, $bgr = 0, $bgg = 255, $bgb = 0, $mixline = 3, $mixpixel = 237) {
		# 初始化AuthWord的属性
		$this->imagewidth = $width;
		$this->imageheight = $height;

		# 新建一个基于调色板的图像
		$this->authimage = imagecreate($width, $height)
		or die("Cannot Initialize new GD image stream");
		# 设置背景颜色
		$this->setBgColor($bgr, $bgg, $bgb);
		# 用背景色填充图片
		imagefill($this->authimage, 0, 0, $this->bgcolor);

		# 生成验证码字符序列
		$this->generateAuthWord($textlen);
		# 绘制验证码
		$this->drawAuthWord();
		# 绘制干扰线
		$this->drawMixLine($mixline);
		# 绘制干扰像素
		$this->drawMixPixel($mixpixel);
		# 以 PNG 格式将图像输出到浏览器或文件
		imagepng($this->authimage);
		# 销毁图片
		imagedestroy($this->authimage);
		return $this->authimage;
	}

	/**
	 * 获取验证码字符序列
	 */
	public function getAuthWord() {
		return $this->authword;
	}

	/**
	 * 设置图像的背景色
	 * 
	 * @param int $red -- 图像背景颜色的RED部分
	 * @param int $green -- 图像背景颜色的GREEN部分
	 * @param int $blue -- 图像背景颜色的BLUE部分
	 */
	private function setBgColor($red, $green, $blue) {
		$this->bgcolor = imagecolorallocate($this->authimage, $red, $green, $blue);
	}

	/**
	 * 颜色随机生成器
	 */
	private function generateColor() {
		return imagecolorallocate($this->authimage, rand()%255, rand()%255, rand()%255);
	}

	/**
	 * 验证码字符序列随机生成器
	 * @param int $num -- 验证码字符序列的长度
	 */
	private function generateAuthWord($num) {
		$origin = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
		$len = strlen($origin);
		for ($i = 0; $i < $num; $i++) {
			$this->authword .= $origin[rand(0, $len)];
		}
	}

	/**
	 * 绘制验证码到图像
	 */
	private function drawAuthWord() {
		for($num = 0; $num < strlen($this->authword); $num++){
			$textcolor = $this->generateColor();
			imagettftext($this->authimage, rand(12,16), (rand(0,60)+330)%360, 5+15*$num+rand(0,4), 18+rand(0,4), $textcolor, $this->font, $this->authword[$num]);
		}
	}

	/**
	 * 绘制干扰线到图像
	 * 
	 * @param int $num -- 干扰线的数量
	 */
	private function drawMixLine($num) {
		for ($i = 0; $i < $num; $i++) {
			$linecolor = $this->generateColor();
			imageline($this->authimage, rand(0, $this->imagewidth / 6), rand(0, $this->imageheight),
			rand($this->imagewidth * 5 / 6, $this->imagewidth), rand(0, $this->imageheight), $linecolor);
		}
	}

	/**
	 * 绘制干扰像素到图像
	 * 
	 * @param int $num -- 干扰像素的数量
	 */
	private function drawMixPixel($num) {
		for ($i = 0; $i < $num; $i++) {
			$pixelcolor = $this->generateColor();
			imagesetpixel($this->authimage, rand() % $this->imagewidth , rand() % $this->imageheight, $pixelcolor);
		}
	}

	# 验证码字符序列
	private $authword = '';
	# 验证码图片
	private $authimage = null;
	# 设置背景颜色
	private $bgcolor = 0;
	# 设置字体
	private $font = "ariblk.ttf";
	# 图片的宽
	private $imagewidth = 77;
	# 图片的高
	private $imageheight = 37;
}
?>